網誌好讀版:http://hungys.logdown.com/posts/238270-azure-blob-service-using-python
在前一篇文章中我們簡單介紹了 Azure SDK for Python,並示範了 Management Service API 的使用以及設計,本文則將開始以 Azure 上的服務為重點,示範如何使用 SDK 來操作這些服務。
Azure Blob Service 是一個專門用來儲存非結構化的大型二進位物件的服務,而且可以透過 HTTP 或 HTTPS 來存取這些資料,此外,您亦可設定為非公開的儲存容器僅提供內部應用程式來使用。在 Blob Service 中,主要包含三個主要元件,依據層級區分分別為 Account、Container 及 Blob:
上面有提到若 Container 是公開的話,可以透過 HTTP 端點來存取,其中 URL 形式為 http://<storage account>.blob.core.windows.net/<container>/<blob>。
Blob Service API 包含在 Azure SDK for Python 當中,相關的原始碼存放在 azure-sdk-for-python / azure / storage 底下。類似於之前介紹的 Management Service API,在 storageclient.py 中的 StorageClient 類別實作了基本的 REST 操作方法,而開發者則可以直接透過 blobservice.py 中繼承 StorageClient 的 BlobService 類別來產生一個物件操作儲存體服務。
在 Python SDK 中關於 Blob Service 的操作皆是透過 BlobService 這個類別,在建立服務實體之前您需要準備好儲存體帳戶的名稱以及 Access Key,這些資訊可以從 Management Portal 取得。
接下來便可以傳入必要的參數來建立一個 BlobService 實體:
from azure.storage import *
blob_service = BlobService(account_name='myaccount', account_key='mykey')
完成之後您就可以使用 blob_service 這個物件來進行相關操作。
若要建立一個 Container,可以使用 create_container() 方法,預設會建立一個 Private Container:
blob_service.create_container('mycontainer')
若要指定存取等級 (ACL),您可以在呼叫時特別傳入 x_ms_blob_public_access 欄位:
blob_service.create_container('mycontainer', x_ms_blob_public_access='container')
即使一開始沒有指定存取等級,您依舊可以使用 set_container_acl() 方法來隨時變更設定:
blob_service.set_container_acl('mycontainer', x_ms_blob_public_access='container')
除此之外,在 SDK 中還提供了其他相關的 API 可以用來操作,例如:
當然,您也可以透過程式碼來刪除特定 Container:
blob_service.delete_container('mycontainer')
若您要上傳的檔案小於 64MB,可以直接使用單一 API 呼叫來達成上傳的目的:
myblob = open(r'test.txt', 'r').read()
blob_service.put_blob('mycontainer', 'myblob', myblob, x_ms_blob_type='BlockBlob')
其中,傳入 put_blob() 的第一個參數為目的地的 Container 名稱,第二個參數則為 Blob 的命名,若您要產生類似資料夾分層的效果,請在 Blob name 中自行加入斜線,最後則是傳入一個串流並指定為一個區塊 Blob,本文將不會針對分頁 Blob 做介紹。
註:對於超過 64MB 的檔案,您必須以不大於 4MB 的區塊大小來分批上傳,相關的 block 切割及操作可以參考 Azure 官方網站中「如何從 Python 使用 Blob 儲存體服務」一文對於「上傳及下載大型 Blob」的解說。
使用 list_blobs() 方法可以回傳一個包含該 Container 底下所有 Blob 的一個清單 (List)。
blobs = blob_service.list_blobs('mycontainer')
blobs 中的每一個元素都是一個 Blob 物件實體,在 __init__.py 中有對其資料結構做了明確的定義,您可以自行存取其中的欄位:
class Blob(WindowsAzureData):
''' Blob class. '''
def __init__(self):
self.name = u''
self.snapshot = u''
self.url = u''
self.properties = BlobProperties()
self.metadata = {}
class BlobProperties(WindowsAzureData):
''' Blob Properties '''
def __init__(self):
self.last_modified = u''
self.etag = u''
self.content_length = 0
self.content_type = u''
self.content_encoding = u''
self.content_language = u''
self.content_md5 = u''
self.xms_blob_sequence_number = 0
self.blob_type = u''
self.lease_status = u''
self.lease_state = u''
self.lease_duration = u''
self.copy_id = u''
self.copy_source = u''
self.copy_status = u''
self.copy_progress = u''
self.copy_completion_time = u''
self.copy_status_description = u''
若要下載 Blob,可以呼叫 get_blob() 方法來獲取一個串流物件並寫入檔案:
blob = blob_service.get_blob('mycontainer', 'myblob')
with open(r'out.txt', 'w') as f:
f.write(blob)
或者,您也可以使用 BlobService 中的 make_blob_url(self, container_name, blob_name) 方法來產生一個 URL 並自行將檔案下載至檔案系統。
當然,您也可以透過 API 來刪除特定的 Blob 物件:
blob_service.delete_blob('mycontainer', 'myblob')
本文針對如何使用 Azure SDK for Python 來操作 Blob Service 做了大致的介紹,若您有瞭解更細部的 API 呼叫相關說明,例如 optional 的參數設定,建議您直接前往 GitHub 上 azure-sdk-for-python / azure / storage 的部分參閱blobservice.py 中對於各個 API 方法的定義。